Pinvon's Blog

所见, 所闻, 所思, 所想

Internet 组管理协议(IGMP)

IGMP 简介

Internet 上多媒体的传播越来越多. 如果有多个用户在网上观看视频, 服务器为每个用户都建立一条通道来传递视频数据, 会给服务器带来极大的负担.

为了使本身规模较大, 而相对互联网又较小的工作组能相互方便工作, 快捷地传递信息, 人们开始发展组播技术.

IGMP 协议与 ICMP 协议一样, 都被当成是 IP 层的一部分, 通过 IP 数据报进行传输. IGMP 有固定的报文长度, 没有可选数据.

IGMP 协议运行在主机和与主机直接相连的路由器之间, 是 IP 主机用来报告多播组成员身份的协议.

主机可以通过 IGMP 协议来告诉本地路由器, 该主机想要加入某组播组; 本地路由器可以通过 IGMP 来查询某特定组的成员是否处于活动状态.

IGMP 使用 224.0.0.1 来与本地路由器通信.

组播地址

D 类地址用于 IP 组播, 地址范围是 224.0.0.0-239.255.255.255

多播组中的成员是动态的, 主机上的进程可以请求其宿主机器加入某个特定组, 也可以在任意时间要求其宿主机器退出某个多播组.

当数据报从 Internet 传送到以太网后, 以太网就利用硬件进行多播, 交付给该组成员的主机.

多播组地址到以太网地址的转换

在多播中, 以太网地址必须以 0x01 开头.

以太网地址一共有 48 位, 其中, 前 25 位是固定的. 剩下的 23 位直接将 IP 地址的低 23 位映射过来.

根据固定的 25 位, 可计算出多播时以太网地址的范围是: 0x01005E000000-0x01005E7FFFFF 之间.

加入组

主机

主机会维护一个表, 表中的内容为进程名和组名.

如果进程所请求的组, 在主机维护的表中不存在, 主机就发送成员关系报告报文.

路由器

路由器会维护一个表, 表中的内容为连接到每一个接口的成员关系. 如:

组播 IP 端口
224.0.0.251 1
224.0.0.252 1,2

退出组

主机可以在任意时间退出一个多播组.

多播路由器收到退出报告后, 并不能立即从表中删除这个组. 因为一个组上可能有多个成员, 如果不是所有成员都退出, 就还得继续维护该表项.

所以, 当有成员退出时, 多播路由器会对这个组发出特殊的查询报文, 要求组内成员在指定时间内响应, 如果这个时间内未收到成员关系报告报文, 则认为该组已经没有成员, 这时才可以清除该表项.

监视成员关系

因为 IGMP 协议多个版本, 有些版本没有退出报告报文. 这样, 即使所有成员都退出了组, 多播路由器也不知道, 这些表会一直存在.

所以, 多播路由器会周期性(默认125s)地发送一般查询报文, 在这个报文中, 组地址为 0.0.0.0

表中的每个组(包括刚成立的新组)都可以进行响应. 最大响应时间是 10s.

每个主机或路由器收到这个查询报文时, 不会立即响应, 因为如果大家都立即响应, 极有可能导致网络拥塞. 所以, 这些主机或路由器会使用随机数产生一个计时器, 当到了计时器的截止时间, 就发送成员关系报告报文. 这个报文是以广播方式发送的, 所以同一个组中的其他成员也会收到, 这时, 它们知道组内已经有成员发送了成员关系报告报文, 它们就不再发送了.

Comments

使用 Disqus 评论
comments powered by Disqus